// 该脚本暂时没测试，未进行优化调整。
// 还需要写一个指令系统

/**
 * 服务器信息结构体
 * @property serverId 服务器唯一ID
 * @property mapName 地图名称
 * @property playerCount 当前人数
 * @property players 玩家名称列表
 * @property host 主持人
 * @property admins 后台管理人员列表
 * @property status 当前地图状态（如 running、waiting、ended）
 * @property countdownEnabled 是否开启倒计时
 */

interface playerData {
    userId: string;
    name: string;
    hanging?: boolean;
    avatar?: string;
}
interface ServerInfo {
    serverId: string;
    mapName: string;
    players: playerData[];
    lastUpdate: number; // 时间戳，毫秒
}

/**
 * 服务器管理模块，提供服务器信息的存储与读取
 */
class Server {
    /**
     * 服务器信息存储空间（分组）
     */
    static serverStorage = storage.getGroupStorage<ServerInfo>('Server');
    /**
     * 所有服务器ID列表的存储key
     */
    // 超时时间，单位毫秒（如5分钟）
    static TIMEOUT = 5 * 60 * 1000;

    /**
     * 存储当前服务器信息
     * @param info 服务器信息对象
     * 会自动维护服务器ID列表
     */
    /**
     * 存储当前服务器信息，并自动更新时间戳
     */
    static async saveServerInfo(info: ServerInfo) {
        const key = info.serverId;
        // 增加更新时间戳
        info.lastUpdate = Date.now();
        await this.serverStorage?.set(key, info);
    }

    /**
     * 读取所有服务器信息
     * @returns 所有服务器信息数组
     */
    /**
     * 获取所有活跃服务器信息（超时自动过滤）
     */
    static async getAllServerInfo(): Promise<ServerInfo[]> {
        // 分页获取所有服务器数据
        const cursor = 0;
        const pageSize = 100;
        const result: ServerInfo[] = [];
        const now = Date.now();
        const queryList = await this.serverStorage?.list({
            cursor,
            pageSize,
        });
        while (true && queryList) {
            // getCurrentPage() 返回本页所有键值对
            for (const item of queryList.getCurrentPage()) {
                const id = item?.key;
                // 跳过特殊key
                if (
                    typeof id !== 'string' ||
                    id === '' ||
                    id === 'world.serverIds'
                ) {
                    continue;
                }
                try {
                    const info =
                        typeof item?.value === 'string'
                            ? item.value
                            : (item?.value as unknown as ServerInfo);
                    if (
                        info &&
                        info.lastUpdate &&
                        now - info.lastUpdate < this.TIMEOUT
                    ) {
                        result.push(info);
                    }
                } catch {}
            }
            if (queryList.isLastPage) {
                break;
            }
            await queryList.nextPage();
        }
        return result;
    }

    /**
     * 获取当前服务器信息
     * @returns 当前服务器信息对象或null
     */
    static async getCurrentServerInfo(): Promise<ServerInfo | null> {
        const key = world.serverId;
        const infoRaw = await this.serverStorage?.get(key);
        if (infoRaw) {
            try {
                return infoRaw.value as ServerInfo;
            } catch {}
        }
        return null;
    }
}

export { Server };
